package org.dei.perla.sys.console;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import org.dei.perla.sys.console.ConsoleMessage.*;
import org.dei.perla.sys.console.TestQueryMessage.TestQueryRequest;

import com.google.protobuf.ByteString;


/**
 * Classe astratta che da estendere
 * @author Diego
 *
 */
public class ConsoleClient {

	Socket sd = null;
	
	/**
	 * Metodo per connettersi al server, specificando indirizzo e port
	 */
	public Socket connectTo(String parHost, int parPort) {
		
		try {
			System.out.println("CLIENT: connecting....\n");
			sd = new Socket(InetAddress.getByName(parHost),parPort);
			
		} catch (Exception e) {
			System.out.println("CLIENT: error during connection...\n");
		}
		System.out.println("CLIENT: connected!\n");
		return sd;
	}
	
	
	/**
	 * Disconnette dal server a cui ci si è connessi attraverso connectTo()
	 * @return TRUE se la disconnessione è andata a buon fine, FALSE altrimenti
	 */
	public boolean disconnect() {		
		try {			
			this.sd.close();
			return true;
		} catch (IOException e) {
			System.out.println("Errore nella disconnessione");
			return false;
		}
		
	}
	
	/**
	 * Effettua la richiesta al server usando Google ProtoBuf per la codifica dei messaggi
	 * @param parCommand il comando da inviare (come header)
	 * @param parPayload l'oggetto <t>MessagePayLoad</t> da inviare
	 * @return 
	 */
	public String request(PerLaRequest.CommandType parCommand, String value) {
		
		//inizio a preparare il messaggio...
		ConsoleMessage.PerLaRequest.Builder messageBuilder = ConsoleMessage.PerLaRequest.newBuilder();
		
		//...setto il tipo di comando
		messageBuilder.setRequestHeader(parCommand);
						
		//...creo il messaggio di payload
		TestQueryRequest.Builder testQueryRequestBuilder = TestQueryRequest.newBuilder();
		testQueryRequestBuilder.setQueryToTest(value);
		
		messageBuilder.setTestQueryRequestMessage(testQueryRequestBuilder.build());
				
		//..ora il messaggio è ronto per essere spedito
		ConsoleMessage.PerLaRequest tMessageToSend = messageBuilder.build();
		
		//...spedisco la richiesta		
		ConsoleUtils.sendRequest(tMessageToSend, sd);							
					
		//...lato server dovrebbe aver elaborato, quindi aspetto la risposta, che restituisco
		return ConsoleUtils.receiveResponse(sd).getTestQueryResponseMessage().getQueryError();
	}
	
	
}
